import requests
from bs4 import BeautifulSoup
import urllib.parse  # 用于处理 URL 编码


def search_baidu(keyword, num_results=10):
    """
    爬取百度搜索引擎的搜索结果。

    Args:
        keyword (str): 搜索关键词。
        num_results (int): 要获取的搜索结果数量 (最多 10 个)。

    Returns:
        list: 包含搜索结果的列表，每个结果是一个字典，包含 'title' 和 'url' 键。
              如果发生错误，返回 None。
    """
    try:
        # 1. 构建搜索 URL
        # 百度搜索 URL 的基本结构
        base_url = "https://www.baidu.com/s"
        # 使用 urllib.parse.urlencode 对关键词进行 URL 编码
        params = {
            "wd": keyword,  # 搜索关键词
            "rn": num_results  # 每页显示结果数
        }
        search_url = f"{base_url}?{urllib.parse.urlencode(params)}"

        # 2. 发送 HTTP 请求
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"  # 模拟浏览器
        }
        response = requests.get(search_url, headers=headers)
        response.raise_for_status()  # 检查 HTTP 状态码

        # 3. 解析 HTML
        soup = BeautifulSoup(response.text, "html.parser")

        # 4. 提取搜索结果
        results = []
        # 找到所有 class 为 'result' 的 div 标签，这些通常是搜索结果
        for div in soup.find_all("div", class_="result"):
            try:
                # 提取标题（从 h3 标签中获取）
                title_tag = div.find("h3")
                if title_tag:
                    title = title_tag.get_text(strip=True)  # 获取标题文本，并去除首尾空格
                else:
                    title = "无标题"

                # 提取 URL（从 a 标签中获取）
                url_tag = div.find("a")
                if url_tag and url_tag.get("href"):  # 检查 href 属性是否存在
                    url = url_tag.get("href")
                else:
                    url = "无链接"
                # 提取摘要
                summary_tag = div.find('div', class_='c-abstract')
                if summary_tag:
                    summary = summary_tag.get_text(strip=True)
                else:
                    summary = "无摘要"


                results.append({"title": title, "url": url, "summary": summary})
            except Exception as e:
                print(f"处理单个搜索结果时发生错误: {e}")
                continue  # 继续处理下一个结果

        return results

    except requests.exceptions.RequestException as e:
        print(f"网络请求错误: {e}")
        return None
    except Exception as e:
        print(f"发生其他错误: {e}")
        return None


if __name__ == "__main__":
    keyword = input("请输入要搜索的关键词: ")
    num_results = int(input("请输入要获取的搜索结果数量 (最多 10 个): "))
    if num_results > 10:
        num_results = 10
        print("最多只能获取 10 个搜索结果。")

    search_results = search_baidu(keyword, num_results)

    if search_results:
        print(f"\n搜索结果 (关键词: {keyword}):")
        for i, result in enumerate(search_results):
            print(f"{i + 1}. 标题: {result['title']}")
            print(f"   链接: {result['url']}")
            print(f"   摘要: {result['summary']}")
            print("-" * 20)
    else:
        print("未找到搜索结果或发生错误。")
